extensions: make fastpath for R'G'B'A u8 to cairo-ARGB32 have 0 error
authorØyvind Kolås <pippin@gimp.org>
Mon, 30 Jul 2012 20:48:57 +0000 (22:48 +0200)
committerØyvind Kolås <pippin@gimp.org>
Mon, 30 Jul 2012 20:48:57 +0000 (22:48 +0200)
extensions/cairo.c

index 2e224d0cf5996cf2539d78fa1dbff040f8ac0a85..69e7275a3122ff912bd1c4508e346553d51cd02f 100644 (file)
@@ -54,14 +54,14 @@ conv_rgb8_cairo24_le (unsigned char *src, unsigned char *dst, long samples)
 }
 
 static inline long
-conv_rgbA8_cairo32_le (unsigned char *src, unsigned char *dst, long samples)
+conv_rgbA8_premul_cairo32_le (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
   while (n--)
     {
-      dst[0] = src[2] * src[3];
-      dst[1] = src[1] * src[3];
-      dst[2] = src[0] * src[3];
+      dst[0] = src[2];
+      dst[1] = src[1];
+      dst[2] = src[0];
       dst[3] = src[3];
       src+=4;
       dst+=4;
@@ -69,15 +69,19 @@ conv_rgbA8_cairo32_le (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
+static float         lut_linear[1 << 8];
+
 static inline long
-conv_rgbA8_premul_cairo32_le (unsigned char *src, unsigned char *dst, long samples)
+conv_rgbA8_cairo32_le (unsigned char *src, unsigned char *dst, long samples)
 {
   long n = samples;
   while (n--)
     {
-      dst[0] = src[2];
-      dst[1] = src[1];
-      dst[2] = src[0];
+#define div_255(a) ((((a)+127)+(((a)+127)>>8))>>8)
+      dst[0] = div_255 (src[2] * src[3]);
+      dst[1] = div_255 (src[1] * src[3]);
+      dst[2] = div_255 (src[0] * src[3]);
+#undef div_255
       dst[3] = src[3];
       src+=4;
       dst+=4;
@@ -85,6 +89,7 @@ conv_rgbA8_premul_cairo32_le (unsigned char *src, unsigned char *dst, long sampl
   return samples;
 }
 
+
 int
 init (void)
 {